﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.Framework.Controls;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code;
using PlanProd.Contracts.enums;
using Web.Framework;
using WebAppPlanProduccion.Code.Security;
using System.Collections.Specialized;

namespace WebAppPlanProduccion.App
{
    public partial class DesvioIndividual : BasePage
    {
        private PlanProduccion PlanProduccion
        {
            //get
            //{
            //    return (PlanProduccion)ViewState["PlanProduccion"];
            //}
            //set
            //{
            //    ViewState["PlanProduccion"] = value;
            //}
            get;
            set;
        }

        private Desvio Desvio
        {
            get
            {
                return (Desvio)ViewState["DesvioPrimera"];
            }
            set
            {
                ViewState["DesvioPrimera"] = value;
            }
        }

        private int PlanProduccionId
        {
            get
            {
                return (int)ViewState["PlanProduccionId"];
            }
            set
            {
                ViewState["PlanProduccionId"] = value;
            }
        }

        private int DetalleProdPrimeraId
        {
            get
            {
                return (int)ViewState["DetalleProdPrimeraId"];
            }
            set
            {
                ViewState["DetalleProdPrimeraId"] = value;
            }
        }

        private int? DetalleProdSegundaId
        {
            get
            {
                return (int?)ViewState["DetalleProdSegundaId"];
            }
            set
            {
                ViewState["DetalleProdSegundaId"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                HasPermissionToSeeMe(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER);

                if (!IsPostBack)
                {
                    int desvioId;
                    if (this.Request.QueryString["Id"] != null)
                    {
                        desvioId = Convert.ToInt32(this.Request.QueryString["Id"]);

                        // Intento obtener el desvio del producto para ese plan
                        Desvio = WebServiceHelper.GetDesvioById(desvioId);

                        PlanProduccionId = Desvio.PlanProduccionId;

                        DetalleProdPrimeraId = Desvio.PlanProduccionDetallePrimeraId;
                        DetalleProdSegundaId = Desvio.PlanProduccionDetalleSegundaId;
                    }
                    else
                    {
                        if (this.Request.QueryString["detalleProdId"] == null)
                            throw new ArgumentException("No se especificó el producto", "detalleProdId");
                        if (this.Request.QueryString["planProdId"] == null)
                            throw new ArgumentException("No se especificó el plan de producción", "planProdId");

                        PlanProduccionId = Convert.ToInt32(this.Request.QueryString["planProdId"]);
                        int detalleProdId = Convert.ToInt32(this.Request.QueryString["detalleProdId"]);

                        // Intento obtener el desvio del producto para ese plan
                        Desvio = WebServiceHelper.GetDesvioByProductoDelPlanDeProduccion(detalleProdId);

                        DetalleProdPrimeraId = Desvio.PlanProduccionDetallePrimeraId;
                        DetalleProdSegundaId = Desvio.PlanProduccionDetalleSegundaId;

                    }

                    PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());

                    string seleccioneUnValor = string.Empty;
                    if (Desvio.Id == 0)
                    {
                        seleccioneUnValor = "Seleccione un valor";
                    }

                    UIHelper.LoadTipoDesvio(this.cboTipoDesvio, seleccioneUnValor);
                    UIHelper.LoadCausaDeDesvio(this.cboDesvioCausa, seleccioneUnValor);

                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private List<int> GetIdsDetalle()
        {
            List<int> detallesId = new List<int>();
            detallesId.Add(DetalleProdPrimeraId);

            if (DetalleProdSegundaId.HasValue)
            {
                detallesId.Add(DetalleProdSegundaId.Value);
            }

            return detallesId;
        }

        private List<LinkButton> actionButtons = new List<LinkButton>();
        LinkButton guardarButton = new LinkButton();
        LinkButton aprobarButton = new LinkButton();
        LinkButton rechazarButton = new LinkButton();
        LinkButton eliminarButton = new LinkButton();
        LinkButton confirmarButton = new LinkButton();  
        LinkButton cancelarButton = new LinkButton();
        LinkButton verOrigenButton = new LinkButton();  
        
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            guardarButton.ID = "BoCommandGuardar";
            guardarButton.Text = "Guardar";
            guardarButton.Click += new EventHandler(lnkGuardar_Click);
            guardarButton.OnClientClick = "return validarGuardar();";
            actionButtons.Add(guardarButton);

            aprobarButton.ID = "BoCommandAprobar";
            aprobarButton.Text = "Aprobar";
            aprobarButton.Click += new EventHandler(lnkAprobar_Click);
            aprobarButton.OnClientClick = "return confirm('Esta seguro que desea aprobar el Desvio?');";
            actionButtons.Add(aprobarButton);

            rechazarButton.ID = "BoCommandRechazar";
            rechazarButton.Text = "Rechazar";
            rechazarButton.Click += new EventHandler(lnkRechazar_Click);
            rechazarButton.OnClientClick = "return confirm('EStá seguro que desea rechazar el desvio?');";
            actionButtons.Add(rechazarButton);

            eliminarButton.ID = "BoCommandEliminar";
            eliminarButton.Text = "Eliminar";
            eliminarButton.Click += new EventHandler(lnkEliminar_Click);
            eliminarButton.OnClientClick = "return confirm('Está seguro que desea eliminar el registro?');";
            actionButtons.Add(eliminarButton);

            confirmarButton.ID = "BoCommandConfirmar";
            confirmarButton.Text = "Confirmar";
            confirmarButton.Click += new EventHandler(lnkConfirmar_Click);
            actionButtons.Add(confirmarButton);

            cancelarButton.ID = "BoCommandCancelar";
            cancelarButton.Text = "Cancelar";
            cancelarButton.Click += new EventHandler(lnkCancelar_Click);
            actionButtons.Add(cancelarButton);

            verOrigenButton.ID = "BoCommandVerOrigen";
            verOrigenButton.Text = "Ver Origen";
            verOrigenButton.Click += new EventHandler(lnkVerOrigen_Click);
            actionButtons.Add(verOrigenButton);                
                       
            base.LoadContextActions(actionButtons);
        }

        protected override void ApplySecurity()
        {
            base.ApplySecurity();

            SetJavascriptForToAvoidConfirmLeave(guardarButton);
            SetJavascriptForToAvoidConfirmLeave(aprobarButton);
            SetJavascriptForToAvoidConfirmLeave(rechazarButton);
            SetJavascriptForToAvoidConfirmLeave(eliminarButton);
            SetJavascriptForToAvoidConfirmLeave(confirmarButton);
            
            SetJavascriptForToAvoidConfirmLeave(lnkGuardar);
            SetJavascriptForToAvoidConfirmLeave(lnkConfirmar);
            SetJavascriptForToAvoidConfirmLeave(lnkAprobar);
            SetJavascriptForToAvoidConfirmLeave(lnkRechazar);
            SetJavascriptForToAvoidConfirmLeave(lnkEliminar);

            PlanProduccionDetalleProd detalleProductoPrimera = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdPrimeraId).Single();

            EstadoCharAprobado estadoDesvio = (EstadoCharAprobado)Desvio.Estado[0];

            this.cboTipoDesvio.Enabled = false;
            this.cboDesvioCausa.Enabled = false;

            // Cuando recién se crea el desvio se puede asignar la causa y el tipo de desvio
            if (Desvio.Id == 0)
            {
                this.cboTipoDesvio.Enabled = true;
                this.cboDesvioCausa.Enabled = true;
                aprobarButton.Visible =
                this.lnkAprobar.Visible = false;
                rechazarButton.Visible =
                this.lnkRechazar.Visible = false;
                eliminarButton.Visible =
                this.lnkEliminar.Visible = false;
                confirmarButton.Visible =
                this.lnkConfirmar.Visible = false;
                guardarButton.Visible =
                this.lnkGuardar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);
                PlanProdDetalleCambios.InputsReadOnly = !HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);
                lnkVerOrigen.Visible = 
                verOrigenButton.Visible = false;
            }
            else if (estadoDesvio == EstadoCharAprobado.EnProgreso)
            {
                this.cboTipoDesvio.Enabled = true;
                this.cboDesvioCausa.Enabled = true;
                aprobarButton.Visible =
                this.lnkAprobar.Visible = false;
                rechazarButton.Visible =
                this.lnkRechazar.Visible = false;
                eliminarButton.Visible =
                this.lnkEliminar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_ELIMINAR);
                confirmarButton.Visible =
                this.lnkConfirmar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CONFIRMAR);
                guardarButton.Visible =
                this.lnkGuardar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);
                PlanProdDetalleCambios.InputsReadOnly = !HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);
                lnkVerOrigen.Visible = 
                verOrigenButton.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER_ORIGEN);
            }
            else if (estadoDesvio == EstadoCharAprobado.EsperandoAprobacion)
            {
                this.cboTipoDesvio.Enabled = false;
                this.cboDesvioCausa.Enabled = false;
                aprobarButton.Visible =
                this.lnkAprobar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_APROBAR);
                rechazarButton.Visible =
                this.lnkRechazar.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_APROBAR);
                eliminarButton.Visible =
                this.lnkEliminar.Visible = false;
                confirmarButton.Visible =
                this.lnkConfirmar.Visible = false;
                guardarButton.Visible =
                this.lnkGuardar.Visible = false;
                PlanProdDetalleCambios.InputsReadOnly = true;
                lnkVerOrigen.Visible = 
                verOrigenButton.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER_ORIGEN);
            }
            else if (estadoDesvio == EstadoCharAprobado.Aprobado || estadoDesvio == EstadoCharAprobado.Rechazado)
            {
                this.cboTipoDesvio.Enabled = false;
                this.cboDesvioCausa.Enabled = false;
                aprobarButton.Visible =
                this.lnkAprobar.Visible = false;
                rechazarButton.Visible =
                this.lnkRechazar.Visible = false;
                eliminarButton.Visible =
                this.lnkEliminar.Visible = false;
                confirmarButton.Visible =
                this.lnkConfirmar.Visible = false;
                guardarButton.Visible =
                this.lnkGuardar.Visible = false;
                PlanProdDetalleCambios.InputsReadOnly = true;
                lnkVerOrigen.Visible = 
                verOrigenButton.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER_ORIGEN);
            }
        }

        private void Bind()
        {
            bool existeSegunda = DetalleProdSegundaId.HasValue;
            // Lleno las grillas
            PlanProduccionDetalleProd detalleProductoPrimera = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdPrimeraId).Single();
            PlanProduccionDetalleProd detalleProductoSegunda = null;
            if (existeSegunda)
            {
                detalleProductoSegunda = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdSegundaId.Value).Single();
            }

            // Asignacion de valores controles de encabezado respecto del producto
            this.txtPlanProduccionId.Text = PlanProduccion.Id.ToString();
            this.txtTemporada.Text = PlanProduccion.TemporadaNombre;
            this.txtDestino.Text = PlanProduccion.DestinoNombre;
            this.txtProveedor.Text = PlanProduccion.ProveedorNombre;
            this.txtProductoArticulo.Text = detalleProductoPrimera.ProductoNombre;
            this.txtProductoColor.Text = detalleProductoPrimera.ColorNombreExterno;
            // Asigno valores en el encabezado que corresponden al desvío
            this.txtDesvioId.Text = Desvio.Id.ToString();
            BindAuditory(Desvio);

            if (Desvio.Id == 0)
            {
                this.txtEstado.Text = "No Guardado";

            }
            else
            {
                EstadoCharAprobado estadoDelDesvio = (EstadoCharAprobado)Desvio.Estado[0];
                this.txtEstado.Text = estadoDelDesvio.GetDescription();
                detalleProductoPrimera.DesvioPendienteDeAprobacion = estadoDelDesvio == EstadoCharAprobado.EsperandoAprobacion;

                this.cboDesvioCausa.SelectedValue = Desvio.CausaDesvioId.ToString();
                this.cboTipoDesvio.SelectedValue = ((int)Desvio.TipoDesvio).ToString();
            }

            this.hidEstado.Value = Desvio.Estado;

            this.txtUSuarioCreacion.Text = Desvio.UsuarioCreador;
            this.txtFechaCreacion.Text = Desvio.FechaCreacion.ToString("dd/MM/yyyy");
            this.txtUsuarioAprobador.Text = Desvio.UsuarioAprobador;
            if (Desvio.FechaAprobacion.HasValue)
            {
                this.txtFechaAprobacion.Text = Desvio.FechaAprobacion.Value.ToString("dd/MM/yyyy");
            }


            // Bindeo la grilla

            // La carga del producto depende de si el producto está aprobado o rechazado. Cuando muestro algo aprobado o rechazado, tengo que mostrar la situación origianl
            Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);

            CantidadesProducto productoPrimera = CargarDatosProducto(detalleProductoPrimera);
            CantidadesProducto productoPrimeraConCambios = CargarDatosProducto(detalleProductoPrimera);

            CargarDetalleDeCantidadesYDesviosParaProducto(detalleProductoPrimera, productoPrimera, productoPrimeraConCambios, temporada);


            TemporadaComercial temporadaComercial = temporada.ToTemporadaComercial(); //new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };

            PlanProdDetalleCambios.ProductoDataSource = productoPrimeraConCambios;
            PlanProdDetalleCambios.BindTemporada = temporadaComercial;

            PlanProdDetalleActual.ProductoDataSource = productoPrimera;
            PlanProdDetalleActual.BindTemporada = temporadaComercial;

            if (detalleProductoPrimera.CalidadId == 2)
            {
                PlanProdDetalleActual.DescPrimera = "Segunda";
                PlanProdDetalleCambios.DescPrimera = "Segunda";
            }

            if (existeSegunda)
            {
                CantidadesProducto productoSegunda = CargarDatosProducto(detalleProductoSegunda);
                CantidadesProducto productoSegundaConCambios = CargarDatosProducto(detalleProductoSegunda);
                CargarDetalleDeCantidadesYDesviosParaProducto(detalleProductoSegunda, productoSegunda, productoSegundaConCambios, temporada);

                PlanProdDetalleCambios.ProductoSegundaDataSource = productoSegundaConCambios;
                PlanProdDetalleActual.ProductoSegundaDataSource = productoSegunda;
            }
        }

        private static CantidadesProducto CargarDatosProducto(PlanProduccionDetalleProd detalleProductoPrimera)
        {
            CantidadesProducto producto = new CantidadesProducto();
            producto.Id = detalleProductoPrimera.Id;
            producto.ProductoId = detalleProductoPrimera.ProductoId;
            producto.ProductoIdExterno = detalleProductoPrimera.ProductoIdExterno;
            producto.ProductoNombre = detalleProductoPrimera.ProductoNombre;
            producto.ColorId = detalleProductoPrimera.ColorIdExterno;
            producto.Color = detalleProductoPrimera.ColorNombreExterno;
            producto.CalidadId = detalleProductoPrimera.CalidadId;
            producto.Calidad = detalleProductoPrimera.Calidad;
            producto.Semanas = new List<SemanaCantidadProducto>();
            return producto;
        }

        private void CargarDetalleDeCantidadesYDesviosParaProducto(PlanProduccionDetalleProd detalleProductoPrimera, CantidadesProducto producto, CantidadesProducto productoConCambios, Temporada temporada)
        {
            DesvioDetalle detalleDesvio = null;
            EstadoCharAprobado estadoDesvio = (EstadoCharAprobado)Desvio.Estado[0];

            HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaAnio();

            foreach (var cantidadSemana in detalleProductoPrimera.CantidadesPorSemana)
            {
                SemanaCantidadProducto semana = new SemanaCantidadProducto();
                semana.NumeroSemana = cantidadSemana.NumeroSemana;
                semana.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                semana.Cantidad = cantidadSemana.Cantidad;
                producto.Semanas.Add(semana);

                detalleDesvio = Desvio.DesvioDetalles.Where(d => d.DetalleProductoCantidadId == cantidadSemana.Id).SingleOrDefault();

                if (detalleDesvio != null)
                {
                    if (estadoDesvio == EstadoCharAprobado.Aprobado || estadoDesvio == EstadoCharAprobado.Rechazado)
                    {
                        semana.Cantidad = detalleDesvio.CantidadInicial; // Muestro la original en la semana de arriba
                    }

                    SemanaCantidadProducto semanaConCambios = new SemanaCantidadProducto();
                    semanaConCambios.NumeroSemana = cantidadSemana.NumeroSemana;
                    semanaConCambios.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                    semanaConCambios.Cantidad = detalleDesvio.CantidadFinal;
                    semanaConCambios.Destacar = true;
                    semana.Destacar = true;
                    productoConCambios.Semanas.Add(semanaConCambios);
                }
                else
                {
                    productoConCambios.Semanas.Add(semana);
                }
            }
        }

        private void Save()
        {
            PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
            Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);


            Desvio desvio = new Desvio();
            // Asignar el estado y el Id
            desvio.Id = UIHelper.GetIntFromInputText(this.txtDesvioId.Text).Value;
            desvio.Estado = this.hidEstado.Value;

            EstadoCharAprobado estadoDesvio = (EstadoCharAprobado)Desvio.Estado[0];

            if (estadoDesvio == EstadoCharAprobado.EnProgreso)
            {
                Desvio.TipoDesvio = (TipoDesvio)Convert.ToInt32(this.cboTipoDesvio.SelectedValue);
                Desvio.CausaDesvioId = UIHelper.GetIntFromInputCbo(this.cboDesvioCausa).Value;
                Desvio.PlanProduccionDetallePrimeraId = DetalleProdPrimeraId;
                Desvio.UsuarioCreador = BaseWebPage.UserName;

                // Capturo los valores que vinieron en los inputs y creo el desvio
                PlanProduccionDetalleProd detalleProducto = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdPrimeraId).Single();
                var cantidadesPorSemanaOrdenadas = detalleProducto.CantidadesPorSemana.OrderBy(s => s.NumeroSemana);

                bool existeSegunda = DetalleProdSegundaId.HasValue;
                PlanProduccionDetalleProd detalleProductoSegunda = null;
                if (existeSegunda)
                {
                    detalleProductoSegunda = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdSegundaId.Value).Single();
                }

                int totalOriginal = 0;
                int totalConCambios = 0;

                HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaOrden();

                Desvio.DesvioDetalles.Clear();
                foreach (var cantidadSemana in cantidadesPorSemanaOrdenadas)
                {
                    int orden = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                    string inputName = PlanProdDetalleCambios.ClientID + "_planprodcant_" + orden + "_1";
                    string inputNameSegunda = PlanProdDetalleCambios.ClientID + "_planprodcant_" + orden + "_2";

                    string valorSemanaInput = this.Request.Form[inputName];
                    string valorSemanaInputSegunda = string.Empty;
                    if (existeSegunda)
                    {
                        valorSemanaInputSegunda = this.Request.Form[inputNameSegunda];
                    }

                    if (!String.IsNullOrEmpty(valorSemanaInput))
                    {
                        int valorSemanaInputInt = Convert.ToInt32(valorSemanaInput);

                        totalOriginal += cantidadSemana.Cantidad;
                        totalConCambios += valorSemanaInputInt;
                        // Si hubo un cambio
                        if (valorSemanaInputInt != cantidadSemana.Cantidad)
                        {
                            DesvioDetalle detalleDesvio = new DesvioDetalle();
                            detalleDesvio.DetalleProductoCantidadId = cantidadSemana.Id;
                            detalleDesvio.CantidadInicial = cantidadSemana.Cantidad;
                            detalleDesvio.CantidadFinal = valorSemanaInputInt;
                            Desvio.DesvioDetalles.Add(detalleDesvio);
                        }
                    }

                    if (existeSegunda)
                    {
                        if (!String.IsNullOrEmpty(valorSemanaInputSegunda))
                        {
                            int valorSemanaInputIntSegunda = Convert.ToInt32(valorSemanaInputSegunda);
                            PlanProduccionDetalleProdSemanal cantidadSemanaSegunda = detalleProductoSegunda.CantidadesPorSemana.Where(c => c.NumeroSemana == cantidadSemana.NumeroSemana).Single();
                            totalOriginal += cantidadSemana.Cantidad;
                            totalConCambios += valorSemanaInputIntSegunda;
                            // Si hubo un cambio
                            if (valorSemanaInputIntSegunda != cantidadSemanaSegunda.Cantidad)
                            {
                                DesvioDetalle detalleDesvioSegunda = new DesvioDetalle();
                                detalleDesvioSegunda.DetalleProductoCantidadId = cantidadSemanaSegunda.Id;
                                detalleDesvioSegunda.CantidadInicial = cantidadSemanaSegunda.Cantidad;
                                detalleDesvioSegunda.CantidadFinal = valorSemanaInputIntSegunda;
                                Desvio.DesvioDetalles.Add(detalleDesvioSegunda);
                            }
                        }
                    }
                }

                if (Desvio.TipoDesvio == TipoDesvio.Movimiento && !Desvio.EsMovimientoValido())
                {
                    this.masterPage.ShowMessage("El desvío del tipo movimiento debe mantener el total inalterado", WebMessageType.Warning);
                }
                else
                {
                    Desvio = WebServiceHelper.SaveDesvio(Desvio);
                }
            }
        }

        private void Eliminar()
        {
            try
            {
                if (Desvio != null && Desvio.Id != 0)
                {
                    WebServiceHelper.EliminarDesvio(Desvio.Id);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkAprobar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Desvio != null && Desvio.Id != 0)
                {
                    WebServiceHelper.AprobarDesvio(Desvio.Id, BaseWebPage.UserName, EstadoCharAprobado.Aprobado);
                    PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
                    Desvio = WebServiceHelper.GetDesvioById(Desvio.Id);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                Bind();
            }
        }

        protected void lnkRechazar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Desvio != null && Desvio.Id != 0)
                {
                    WebServiceHelper.AprobarDesvio(Desvio.Id, BaseWebPage.UserName, EstadoCharAprobado.Rechazado);
                    PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
                    Desvio = WebServiceHelper.GetDesvioById(Desvio.Id);
                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Desvio != null && Desvio.Id != 0)
                {
                    WebServiceHelper.AprobarDesvio(Desvio.Id, BaseWebPage.UserName, EstadoCharAprobado.EsperandoAprobacion);
                    PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
                    Desvio = WebServiceHelper.GetDesvioById(Desvio.Id);
                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                Eliminar();
                PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
                Desvio = WebServiceHelper.GetDesvioByProductoDelPlanDeProduccion(DetalleProdPrimeraId);
                Bind();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Save();
                PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());
                Desvio = WebServiceHelper.GetDesvioById(Desvio.Id);
                Bind();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkVerOrigen_Click(object sender, EventArgs e)
        {
            try
            {
                if (Desvio != null && Desvio.Id != 0)
                {
                    this.Response.Redirect(string.Format("/App/DesvioOrigenSap.aspx?Id={0}", Desvio.Id), true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }


        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect(string.Format("/App/PlanProduccionEdit.aspx?Id={0}", PlanProduccionId), true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}